#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void timeout(int sig)
{
	if(sig==SIGALRM)
		puts("Time out!");

	alarm(2);	   //! 闹钟响了过后又定义一个闹钟
}
void keycontrol(int sig)
{
	if(sig==SIGINT)
		puts("CTRL+C pressed");
}

int main(int argc, char *argv[])
{
	int i;
	signal(SIGALRM, timeout);
	signal(SIGINT,  keycontrol);

	// unsigned int alarm(unsigned int seconds); 创建一个闹钟并注册时间
	alarm(2);

	/**
	 * @brief 发生信号时将唤醒由于调用sleep函数而进入阻塞状态的进程
	 * 
	 * 调用函数的主体的确是操作系统，但进程处于睡眠状态时无法调用函数。因此，产生信号时，为了调用信号处理器，将唤醒由于
	 * 调用sleep函数而进入阻塞状态的进程。而且，进程一旦被唤醒，就不会再进入睡眠状态。即使还未到sleep函数中规定的时间
	 * 也是如此。所以，上述示例运行不到10秒就会结束，连续输入CTRL+C则有可能1秒都不到。
	 */
	for(i=0; i<3; i++)
	{
		puts("wait...");
		sleep(10);         // 被
	}
	return 0;
}